home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 July: Mac OS SDK / Dev.CD Jul 97 SDK1.toast / Development Kits (Disc 1) / QuickDraw GX / Programming Stuff / Sample Code / Printing Samples / Applications… / QuickDraw GX Aware Sample ƒ / Simple Sample ƒ / events.c next >
Encoding:
C/C++ Source or Header  |  1996-03-20  |  8.6 KB  |  376 lines  |  [TEXT/MMCC]

  1. /*********************************************************************
  2.  
  3.     events.c
  4.     
  5.     This file contains the event handling code for the QuickDraw GX
  6.     unaware sample, "Simple Sample."
  7.     
  8.     Additional info can be found in the related develop #19 article,
  9.     "Adding QuickDraw GX Printing to QuickDraw Applications."
  10.  
  11.     Dave Hersey, Apple Developer Technical Support.
  12.     
  13.     ——————— Edit Trail ———————
  14.     
  15.     begat:                                            1/22/94  - dmh
  16.     cleaned up for 2nd draft of develop article:    3/10/94  - dmh
  17.     cleaned up for final:                            4/14/94  - dmh
  18.     added NewAEEventHandlerProc to build ppc upp    8/16/94  - nick
  19.     
  20. *********************************************************************/
  21.  
  22. #include "Simple Sample.h"
  23.  
  24.  
  25. /************************************************************
  26.   MyEventLoop - This routine (in conjunction with main)
  27.   makes up our event loop.
  28.  
  29.  *************************************************************/
  30.  
  31. void MyEventLoop()
  32. {
  33.     EventRecord        theEvent;
  34.  
  35.     if (WaitNextEvent(everyEvent, &theEvent, gSleep, nil))
  36.         MyDoEvent(&theEvent);
  37. }
  38.  
  39.  
  40. /************************************************************
  41.   MyDoEvent - This routine handles event dispatching.
  42.  
  43.  *************************************************************/
  44.  
  45. void MyDoEvent(EventRecord *theEvent)
  46. {
  47.     char            key;
  48.     WindowPtr         whichWindow;
  49.     MyDocumentPtr    windowDoc;
  50.  
  51.     switch(theEvent->what)
  52.     {                    
  53.         case updateEvt:            // Updating a window.
  54.  
  55.             if (((WindowPeek) theEvent->message)->windowKind == userKind)
  56.                 MyUpdateWindow((WindowPtr) theEvent->message);
  57.  
  58.             break;
  59.         
  60.         case mouseDown:            // Mousedown in a window or menu.
  61.     
  62.             switch (FindWindow(theEvent->where, &whichWindow))
  63.             {
  64.                 case inSysWindow:
  65.  
  66.                     SystemClick(theEvent, whichWindow);
  67.                     break;
  68.                         
  69.                 case inDrag:
  70.  
  71.                     if (((WindowPeek) whichWindow)->windowKind == userKind)
  72.                     {
  73.                         DragWindow(whichWindow, theEvent->where, &qd.screenBits.bounds);
  74.                         MyAdjustMenus();
  75.                     }
  76.                     break;
  77.  
  78.                 case inGoAway:
  79.  
  80.                     if ((((WindowPeek) whichWindow)->windowKind == userKind) &&
  81.                         (TrackGoAway(whichWindow, theEvent->where)))
  82.                     {
  83.                         MyDisposeDocument(MyGetDocPtr(whichWindow));
  84.                         MyAdjustMenus();
  85.                     }
  86.                     
  87.                     break;
  88.                 
  89.                 case inContent:
  90.  
  91.                     if (((WindowPeek) whichWindow)->windowKind == userKind)
  92.                     {
  93.                         SelectWindow(whichWindow);
  94.                         MyAdjustMenus();
  95.                     }
  96.                     
  97.                     break;
  98.  
  99.                 case inMenuBar:
  100.                     MyDoMenuCommand(MenuSelect(theEvent->where));
  101.                     MyAdjustMenus();
  102.                     break;
  103.             }
  104.  
  105.         case keyDown:            // Key pressed.
  106.         case autoKey:
  107.  
  108.             key = theEvent->message & charCodeMask;
  109.             if ((theEvent->modifiers & cmdKey) &&
  110.                 (theEvent->what == keyDown))
  111.                 {
  112.                     MyDoMenuCommand(MenuKey(key));
  113.                     MyAdjustMenus();
  114.                 }
  115.             
  116.             break;
  117.  
  118.         case kOSEvent:            // Operating system event.
  119.  
  120.             switch ((unsigned long) theEvent->message >> 24)
  121.             {
  122.                  case kSuspendResumeMessage:                            // Suspend event:
  123.                     if ((theEvent->message & kResumeMask) == 0)
  124.                         gSleep = 80;
  125.                     else                                            // Resume event:
  126.                     {
  127.                         gSleep = 0;
  128.                         SetCursor(&qd.arrow);
  129.                     }
  130.  
  131.  
  132.                 break;
  133.             }
  134.  
  135.             break;
  136.                 
  137.         case kHighLevelEvent:    // AppleEvent.
  138.  
  139.             AEProcessAppleEvent(theEvent);
  140.             break;
  141.     }
  142. }
  143.  
  144.  
  145. /************************************************************
  146.   MyDoAEInstallation - This routine installs our core
  147.   AppleEvent handlers.
  148.  
  149. *************************************************************/
  150.  
  151. void MyDoAEInstallation()
  152. {
  153.     AEInstallEventHandler(kCoreEventClass,
  154.                           kAEOpenApplication,
  155.                           NewAEEventHandlerProc(MyHandleOAPP),
  156.                           0, false);
  157.  
  158.     AEInstallEventHandler(kCoreEventClass,
  159.                           kAEQuitApplication,
  160.                           NewAEEventHandlerProc(MyHandleQUIT),
  161.                           0, false);
  162.  
  163.     AEInstallEventHandler(kCoreEventClass,
  164.                           kAEOpenDocuments,
  165.                           NewAEEventHandlerProc(MyHandleODOC),
  166.                           0, false);
  167.  
  168.     AEInstallEventHandler(kCoreEventClass,
  169.                           kAEPrintDocuments,
  170.                           NewAEEventHandlerProc(MyHandlePDOC),
  171.                           0, false);
  172. }
  173.  
  174.  
  175. /************************************************************
  176.   MyHandleOAPP - This is the "open application" AppleEvent
  177.   handler.  We check out the message, and set our "should we
  178.   quit after handling a 'pdoc'" flag to false.  If we got an
  179.   'oapp', we weren't launched via 'pdoc'.
  180.  
  181. *************************************************************/
  182.  
  183. pascal OSErr MyHandleOAPP(AppleEvent *theAppleEvent, AppleEvent *reply, long myRefCon)
  184. {
  185. #pragma unused (reply, myRefCon)
  186.     
  187.     gQuitAfterPrinting = false;
  188.     return MyCheckAEParams(theAppleEvent);
  189. }
  190.  
  191.  
  192. /************************************************************
  193.   MyHandleQUIT - This is the "quit" AppleEvent handler.  Set
  194.   the gQuitting flag and the event loop will do the rest.
  195.  
  196. *************************************************************/
  197.  
  198. pascal OSErr MyHandleQUIT(AppleEvent *theAppleEvent, AppleEvent *reply, long myRefCon)
  199. {
  200. #pragma unused (reply, myRefCon)
  201.  
  202.     gQuitting = true;
  203.     return MyCheckAEParams(theAppleEvent);
  204. }
  205.  
  206.  
  207. /************************************************************
  208.   MyHandleODOC - This is the "open document" AppleEvent
  209.   handler, so open some documents.
  210.  
  211. *************************************************************/
  212.  
  213. pascal OSErr MyHandleODOC(AppleEvent *theAppleEvent, AppleEvent *reply, long myRefCon)
  214. {
  215.     OSErr            err;
  216.     AEDescList        docList;
  217.     FSSpec            myFSS;
  218.     AEKeyword        theKeyword;
  219.     DescType        typeCode;
  220.     long            doc, itemsInList;
  221.     Size            actualSize;
  222.     MyDocumentPtr    newDocument;
  223.  
  224. #pragma unused (reply, myRefCon)
  225.  
  226.     gQuitAfterPrinting = false;
  227.  
  228. // Get the event's document list.
  229.  
  230.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, &docList);
  231.     nrequire(err, AEError);
  232.  
  233.     err = MyCheckAEParams(theAppleEvent);
  234.     nrequire(err, CheckAEParamsFailed);
  235.     
  236.  
  237. // Open all entries in the document list.
  238.  
  239.     err = AECountItems(&docList, &itemsInList);
  240.     nrequire(err, AECountItemsFailed);
  241.  
  242.     for (doc = 1; (!err) && (doc <= itemsInList); doc++)
  243.     {
  244.         err = AEGetNthPtr(&docList, doc, typeFSS, &theKeyword, &typeCode,
  245.                           (Ptr) &myFSS, sizeof(FSSpec), &actualSize);
  246.     
  247.         nrequire(err, AEEntryError);
  248.  
  249.         err = MyCreateDocument(kDefaultTitle, &newDocument);
  250.         nrequire(err, CreateDocFailed);
  251.  
  252.         err = MyFSLoadDocument(newDocument, &myFSS, false);
  253.  
  254.         if (err == noErr)
  255.         {
  256.             ShowWindow(newDocument->documentWindow);
  257.             SelectWindow(newDocument->documentWindow);
  258.         }
  259.         else
  260.             MyDisposeDocument(newDocument);
  261.     }
  262.  
  263. CreateDocFailed:
  264. AEEntryError:
  265. AECountItemsFailed:
  266. CheckAEParamsFailed:
  267.     AEDisposeDesc(&docList);
  268.     MyAdjustMenus();
  269.  
  270. AEError:
  271.     return err;
  272. }
  273.  
  274.  
  275. /************************************************************
  276.   MyHandlePDOC - This is the "print document" AppleEvent
  277.   handler, so print some documents.
  278.  
  279. *************************************************************/
  280.  
  281. pascal OSErr MyHandlePDOC(AppleEvent *theAppleEvent, AppleEvent *reply, long myRefCon)
  282. {
  283.     OSErr            err;
  284.     AEDescList        docList;
  285.     FSSpec            myFSS;
  286.     long            itemsInList, i;
  287.     AEKeyword        theKeyword;
  288.     DescType        typeCode;
  289.     Size            actualSize;
  290.     MyDocumentPtr    newDocument;
  291.  
  292. #pragma unused (reply, myRefCon)
  293.  
  294. // Get our document list.
  295.  
  296.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeAEList, &docList);
  297.     nrequire(err, AEError);
  298.  
  299. /*
  300.     Make sure we've accounted for all of the parameters
  301.     passed, and count the number of documents passed in.
  302. */
  303.  
  304.     err = MyCheckAEParams(theAppleEvent);
  305.     nrequire(err, AEError);
  306.     
  307.     err = AECountItems(&docList, &itemsInList);
  308.     nrequire(err, AEError);
  309.  
  310. /*
  311.     For each entry in the document list, load it,
  312.     print it, and close it.
  313. */
  314.  
  315.     for (i = 1; i<= itemsInList; i++)
  316.     {
  317.         err = AEGetNthPtr(&docList, i, typeFSS, &theKeyword, &typeCode,
  318.                           (Ptr) &myFSS, sizeof(FSSpec), &actualSize);
  319.  
  320.         nrequire(err, AEEntryError);
  321.  
  322. // Load the document.
  323.  
  324.         err = MyCreateDocument(kDefaultTitle, &newDocument);
  325.         nrequire(err, CreateDocFailed);
  326.  
  327.         err = MyFSLoadDocument(newDocument, &myFSS, true);
  328.         nrequire(err, LoadDocFailed);
  329.  
  330. //    Print the document.
  331.  
  332.         err = MyPrintDocument(newDocument);
  333.  
  334. // Close the document once it's printed.
  335.  
  336. LoadDocFailed:
  337.         MyDisposeDocument(newDocument);
  338.     }
  339.  
  340. // When we're all done throw away the description lists and return.
  341.  
  342. CreateDocFailed:
  343. AEEntryError:
  344.     AEDisposeDesc(&docList);
  345.  
  346. AEError:
  347.     if (gQuitAfterPrinting)
  348.         gQuitting = true;
  349.  
  350.     return err;
  351. }
  352.  
  353.  
  354. /************************************************************
  355.   MyCheckAEParams - This routine is used to make sure we've
  356.   received all the parameters for an AppleEvent.  If so, we
  357.   return noErr, otherwise we indicate that the event wasn't
  358.   handled completely.
  359.  
  360.  *************************************************************/
  361.  
  362. OSErr MyCheckAEParams(AppleEvent *theAppleEvent)
  363. {
  364.     OSErr        err;
  365.     DescType    typeCode;
  366.     Size        actualSize;
  367.     
  368.     err = AEGetAttributePtr(theAppleEvent, keyMissedKeywordAttr,
  369.                             typeWildCard, &typeCode, nil, 0, &actualSize);
  370.  
  371.     if (err == errAEDescNotFound) return noErr;
  372.     if (err == noErr) return errAEEventNotHandled;
  373.     
  374.     return err;
  375. }
  376.